{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "41f00dbb-b065-469c-a98d-72aedfc89bcf",
   "metadata": {},
   "source": [
    "# 数据清洗和数据集准备\n",
    "\n",
    "## 每天记账\n",
    "\n",
    "事由 消费金额\n",
    "\n",
    "## 网购\n",
    "\n",
    "## 黄金价格\n",
    "\n",
    "## 天气预报\n",
    "\n",
    "日期 天气状况 湿度 温度 紫外系数     \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24ef10ec-5392-4192-95bf-1ff9ba528803",
   "metadata": {},
   "source": [
    "# 怎样用Pandas清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "af32b33f-17bd-4816-8d36-2cb2f3f48275",
   "metadata": {},
   "outputs": [],
   "source": [
    "#前置运行\n",
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 331,
   "id": "560a3834-a81e-4923-b5cd-73dcd7b70e17",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib\n",
    "# 指定默认字体  \n",
    "matplotlib.rcParams['font.family']='sans-serif'  \n",
    "matplotlib.rcParams['font.sans-serif'] = ['SimHei']   \n",
    "#解决负号'-'显示为方块的问题  \n",
    "matplotlib.rcParams['axes.unicode_minus'] = False "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "9ccf27d2-6bcf-4f46-a652-d6ebe252b8ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.arange(0,128,2).reshape(16,4),\n",
    "                 columns=['A','B','C','D'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "5d7e64cb-326c-465a-aa77-ce262893287c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#删除C\n",
    "df.drop(['C'], axis=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "34be7cf1-c660-48ef-acf3-cbac2dd35c31",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df  #并没有去除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "f9720d62-b4c6-4baf-830f-886d1de91a5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "#彻底去除C\n",
    "df.drop(['C'],axis= 1,inplace = True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "c1e352ca-4c3b-4d58-ab03-186721694e11",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "ab548ccb-ec6f-445a-ab28-697c5dccad60",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "      <th>G</th>\n",
       "      <th>H</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "      <td>12</td>\n",
       "      <td>13</td>\n",
       "      <td>14</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>17</td>\n",
       "      <td>18</td>\n",
       "      <td>19</td>\n",
       "      <td>20</td>\n",
       "      <td>21</td>\n",
       "      <td>22</td>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    A   B   C   D   E   F   G   H\n",
       "0   0   1   2   3   4   5   6   7\n",
       "1   8   9  10  11  12  13  14  15\n",
       "2  16  17  18  19  20  21  22  23"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.arange(24).reshape(3,8),\n",
    "                 columns=['A','B','C','D','E','F','G','H'])\n",
    "df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "02124ea8-502a-42b7-b4c8-17edb6a53dd1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3 entries, 0 to 2\n",
      "Data columns (total 8 columns):\n",
      " #   Column  Non-Null Count  Dtype\n",
      "---  ------  --------------  -----\n",
      " 0   A       3 non-null      int32\n",
      " 1   B       3 non-null      int32\n",
      " 2   C       3 non-null      int32\n",
      " 3   D       3 non-null      int32\n",
      " 4   E       3 non-null      int32\n",
      " 5   F       3 non-null      int32\n",
      " 6   G       3 non-null      int32\n",
      " 7   H       3 non-null      int32\n",
      "dtypes: int32(8)\n",
      "memory usage: 228.0 bytes\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45d58514-b6cd-4c57-b28c-c49b128a35e5",
   "metadata": {},
   "source": [
    "### `df.duplicated()`\n",
    "\n",
    "```python\n",
    "df.duplicated(subset=None, keep='first')\n",
    "```\n",
    "主要参数说明：\n",
    "- `subset=None`，识别重复标签（标量或序列），默认是所有列标签；\n",
    "- `keep='first'`：`'first'`标记第一个之外数据；`'last'`标记最后一个之外数据；`False`标记全部重复数据；"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "a16ed2fd-9374-4222-be05-3a0fa7ede3f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\n",
    "    'id1': ['a', 'a', 'a', 'b', 'b', 'b'],\n",
    "    'id2': ['a1', 'a2', 'a2', 'b1', 'b2', 'b2'],\n",
    "    'x': [1, 2, 3, 4, 5, 5] ,\n",
    "    'y': [0.1, 0.3, 0.3, 0.4, 0.5, 0.5] ,\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "d70540bd-9ddb-4727-a65f-7232f89768bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.duplicated()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "1dbe47b3-1a98-4271-841f-1f0c7b8ab81d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a</td>\n",
       "      <td>a1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "0   a  a1  1  0.1\n",
       "1   a  a2  2  0.3"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "ee20ae18-b526-4cd4-b6fb-33a03eaef932",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "4   b  b2  5  0.5\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "294c6480-c444-487c-8a94-70bd57dd422d",
   "metadata": {},
   "source": [
    "## df.drop_duplicates(subset=None, keep='first', inplace=False)\n",
    "主要参数说明：\n",
    "\n",
    "subset=None，识别重复标签（标量或序列），默认是所有列标签；\n",
    "keep='first'：标记第一个之外数据；标记最后一个之外数据；标记全部重复数据；'first''last'False\n",
    "inplace=False，是否在对象中直接修改；\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 333,
   "id": "80c2b955-7c4b-4582-86ed-a5cd601f91aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave  flam  noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>11436.9000  -1.795e-17  5.534e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>11439.2000  1.203e-16  4.374e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11441.4000  1.857e-17  4.261e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11443.7000  -1.751e-16  3.584e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11446.0000  -8.348e-17  3.160e-17</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   wave  flam  noise\n",
       "0  11436.9000  -1.795e-17  5.534e-17\n",
       "1   11439.2000  1.203e-16  4.374e-17\n",
       "2   11441.4000  1.857e-17  4.261e-17\n",
       "3  11443.7000  -1.751e-16  3.584e-17\n",
       "4  11446.0000  -8.348e-17  3.160e-17"
      ]
     },
     "execution_count": 333,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = pd.read_table('d:/work/astro-pandas-tutorials/Sample_data/rcs0327_knotU_N3_nirspeckeck.txt', \n",
    "                    sep = \"/s+\", comment = \"#\",engine='python')\n",
    "\n",
    "df1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 337,
   "id": "cabc23c7-4280-4d5b-889f-a8ec3221942c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>#Combined spectrum created by combine_nIR_spectra.pro</th>\n",
       "      <th>knotE_N3.specfrom list</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>#Wavelengths were already in vacuum heliocentric</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>#Units are erg/s/cmsq/A</td>\n",
       "      <td>determined by xtellcor_general</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>wave  flam  noise</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11436.9000  -1.795e-17  5.534e-17</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11439.2000  1.203e-16  4.374e-17</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  #Combined spectrum created by combine_nIR_spectra.pro  \\\n",
       "0   #Wavelengths were already in vacuum heliocentric      \n",
       "1                            #Units are erg/s/cmsq/A      \n",
       "2                                  wave  flam  noise      \n",
       "3                  11436.9000  -1.795e-17  5.534e-17      \n",
       "4                   11439.2000  1.203e-16  4.374e-17      \n",
       "\n",
       "            knotE_N3.specfrom list  \n",
       "0                              NaN  \n",
       "1   determined by xtellcor_general  \n",
       "2                              NaN  \n",
       "3                              NaN  \n",
       "4                              NaN  "
      ]
     },
     "execution_count": 337,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = pd.read_csv('d:/work/astro-pandas-tutorials/Sample_data/rcs0327_knotU_N3_nirspeckeck.txt')\n",
    "df1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 339,
   "id": "c7182efe-f024-4461-aaa0-997d571306c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1124 entries, 0 to 1123\n",
      "Data columns (total 2 columns):\n",
      " #   Column                                                 Non-Null Count  Dtype \n",
      "---  ------                                                 --------------  ----- \n",
      " 0   #Combined spectrum created by combine_nIR_spectra.pro  1124 non-null   object\n",
      " 1    knotE_N3.specfrom list                                1 non-null      object\n",
      "dtypes: object(2)\n",
      "memory usage: 17.7+ KB\n"
     ]
    }
   ],
   "source": [
    "df1.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 341,
   "id": "505e112a-6930-48ad-b953-443a2a21de3a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>#Combined spectrum created by combine_nIR_spectra.pro</th>\n",
       "      <th>knotE_N3.specfrom list</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1124</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>unique</th>\n",
       "      <td>1124</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>top</th>\n",
       "      <td>#Wavelengths were already in vacuum heliocentric</td>\n",
       "      <td>determined by xtellcor_general</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>freq</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       #Combined spectrum created by combine_nIR_spectra.pro  \\\n",
       "count                                                1124      \n",
       "unique                                               1124      \n",
       "top      #Wavelengths were already in vacuum heliocentric      \n",
       "freq                                                    1      \n",
       "\n",
       "                 knotE_N3.specfrom list  \n",
       "count                                 1  \n",
       "unique                                1  \n",
       "top      determined by xtellcor_general  \n",
       "freq                                  1  "
      ]
     },
     "execution_count": 341,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 343,
   "id": "d8f0a6d4-024e-4398-86da-f9b1387cd39e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>#Combined spectrum created by combine_nIR_spectra.pro</th>\n",
       "      <th>knotE_N3.specfrom list</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [#Combined spectrum created by combine_nIR_spectra.pro,  knotE_N3.specfrom list]\n",
       "Index: []"
      ]
     },
     "execution_count": 343,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1[df1.duplicated()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 345,
   "id": "36daf174-0037-4d4a-9a9e-1044ba8b957d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "#Combined spectrum created by combine_nIR_spectra.pro       0\n",
       " knotE_N3.specfrom list                                  1123\n",
       "dtype: int64"
      ]
     },
     "execution_count": 345,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 328,
   "id": "5f02d06a-9a8e-4a6a-8e82-b71d2ef0f20e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['#Combined spectrum created by combine_nIR_spectra.pro', ' knotE_N3.specfrom list'], dtype='object')\n"
     ]
    }
   ],
   "source": [
    "print(df1.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 349,
   "id": "5af98273-25bd-420e-b3f0-444bb68d3730",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>#Combined spectrum created by combine_nIR_spectra.pro</th>\n",
       "      <th>knotE_N3.specfrom list</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [#Combined spectrum created by combine_nIR_spectra.pro,  knotE_N3.specfrom list]\n",
       "Index: []"
      ]
     },
     "execution_count": 349,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.loc[df1['#Combined spectrum created by combine_nIR_spectra.pro'].isnull()]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d9dcfe7-a6e3-4989-bb3a-af75063485e2",
   "metadata": {},
   "source": [
    "# 作业："
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71374ec1-5108-46e8-b893-160e587a4bbe",
   "metadata": {},
   "source": [
    "# 1.总结：\n",
    "## 数据的错误类型及处理方法"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf2af13f-0f1a-4812-a1e9-3eca53fd3313",
   "metadata": {},
   "source": [
    "### （1）数据重复 \n",
    "对重复数据进行识别：\n",
    "\r",
    " - `df.duplicated(subset=None, keep='first')`\r\n",
    "\n",
    "主要参数说明\n",
    "\r\n",
    "\r\n",
    "subset=None，识别重复标签（标量或序列），默认是所有列标签；\r\n",
    "keep='first'：标记第一个之外数据；标记最后一个之外数据；标记全部重复数据；'first''last'False"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "370c0a11-ae7c-4c0e-b4f1-9baaa9e771f2",
   "metadata": {},
   "source": [
    "### （2）数据缺失\n",
    "\n",
    "pandas中对缺失数据的常用处理方法有：\n",
    "- `isnull()`: 返回缺失数据的布尔结果\n",
    "- `notnull()`：`isnull()`的否定式\n",
    "- `dropna()`：去除缺失数据\n",
    "- `fillna()`：填充缺失数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d55ebfa6-1699-479b-8c98-4c85e9e65010",
   "metadata": {},
   "source": [
    "### （3）数据异常\n",
    "\n",
    "在数据集中，还有一些数据的格式正常，但其值超乎常规或者不符合业务逻辑。对于这些“异常”数据，要特别小心。它们或许是错误的，但也可能是真实的。\r\n",
    "\r\n",
    "这些异常数据，通常要结合业务逻辑来判断。不同数据集其方法也不同。常用方法是先使用统计得到标准房差，然后设定阈值，超过多少倍标准方差的即为异常数\n",
    "\n",
    "- `describe()`\n",
    "    函数是一个快速获取数据集统计信息的好方法，它可以帮助识别数据中的异常值、偏斜情况和分布形态。\n",
    "\n",
    "    通过合理使用这个函数，你可以更快地了解数据集的特性，为后续的数据分析和处理提供依据。由此对异常数据进行处理。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cf2961a-c829-40e6-82c7-157742ec66cd",
   "metadata": {},
   "source": [
    "# 2.线性拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 281,
   "id": "897159ee-ab66-45c2-84c9-4715b40289fe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0]\n",
      " [ 1]\n",
      " [ 2]\n",
      " [ 3]\n",
      " [ 4]\n",
      " [ 5]\n",
      " [ 6]\n",
      " [ 7]\n",
      " [ 8]\n",
      " [ 9]\n",
      " [10]\n",
      " [11]\n",
      " [12]\n",
      " [13]\n",
      " [14]\n",
      " [15]\n",
      " [16]\n",
      " [17]\n",
      " [18]]\n",
      "[[  5]\n",
      " [ 25]\n",
      " [ 45]\n",
      " [ 65]\n",
      " [ 85]\n",
      " [105]\n",
      " [125]\n",
      " [145]\n",
      " [165]\n",
      " [185]\n",
      " [205]\n",
      " [225]\n",
      " [245]\n",
      " [265]\n",
      " [285]\n",
      " [305]\n",
      " [325]\n",
      " [345]\n",
      " [365]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABU/UlEQVR4nO3de1xUdf7H8deZAcYbkKgwsBKZmUWYlVZqpeYVy0t5bbtpmZmpLatupa0/td3VtE27WNrFtHLLttS0NMouWmau10q0ixWaJoiKAioMMHN+f0xOTeA14MwM7+fjMY9H58xnDp/Tgce8/Z5zvscwTdNEREREJETZrG5AREREpDIp7IiIiEhIU9gRERGRkKawIyIiIiFNYUdERERCmsKOiIiIhDSFHREREQlpCjsiIiIS0hR2REREJKQp7IiIlGPevHkYhsGOHTt861599VUef/xxy3oSkTOjsCMicooUdkSCk8KOiAS0o0ePWt2CiAQ5hR0RCRgTJ07EMAw2bdpE3759qVu3Lo0bN8Y0TZ555hkuueQSatasSd26denbty8//vij3+c3b95M9+7diY2NxeFwkJCQwPXXX8/u3bsB2LFjB4ZhMG/evDI/2zAMJk6ceNze2rdvz7Jly9i5cyeGYfheIhL4wqxuQETk93r37s1NN93EPffcw5EjRxg6dCjz5s3jvvvuY+rUqeTm5vLwww/Tpk0bvvzyS+Li4jhy5AidO3emUaNGPP3008TFxZGdnc3HH39MQUHBH+7pmWee4e677+aHH35g8eLFFbCXIlJVFHZEJOAMHDiQSZMmAbB27Vqef/55HnvsMUaNGuWrueaaazj//POZPn06U6dO5ZtvvuHAgQPMmTOHXr16+er69+9fIT0lJydz1lln4XA4aNWqVYVsU0SqhsKOiAScPn36+P77nXfewTAMbr31VkpLS33rnU4nzZs3Z+XKlQCcd9551K1blwceeICsrCzatm1LcnJyVbcuIgFI1+yISMCJj4/3/ffevXsxTZO4uDjCw8P9XmvXrmX//v0AREdHs2rVKi655BLGjRvHRRddREJCAhMmTKCkpMSqXRGRAKCRHREJOL+98Ld+/foYhsGnn36Kw+EoU/vbdc2aNWPBggWYpslXX33FvHnzePjhh6lZsyYPPvggNWrUAMDlcvlt48CBA5W0JyISCBR2RCSgde/e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U9gRERGRkKaw8wc988wzNGrUiBo1atCiRQs+/fTTE9avWrWKFi1aUKNGDc4991xmz55dRZ1WnClTpnD55ZcTGRlJbGwsN9xwA99+++0JP7Ny5UoMwyjz+uabb6qo64oxceLEMvvgdDpP+JlQOObnnHNOucdv+PDh5dYH8/H+5JNP6NGjBwkJCRiGwVtvveX3vmmaTJw4kYSEBGrWrEn79u3ZunXrSbe7cOFCkpOTcTgcJCcns3jx4kragzN3on0vKSnhgQceoFmzZtSuXZuEhARuv/129uzZc8Jtzps3r9zfhaKiokrem1N3smM+aNCgMv23atXqpNsN9mMOlHvsDMPg0UcfPe42A/GYK+z8Aa+//jppaWk89NBDbN68mWuuuYZu3brx008/lVufmZnJddddxzXXXMPmzZsZN24c9913HwsXLqzizv+YVatWMXz4cNauXcuKFSsoLS2lS5cuHDly5KSf/fbbb8nKyvK9mjRpUgUdV6yLLrrIbx+2bNly3NpQOebr16/32+cVK1YA0K9fvxN+LhiP95EjR2jevDkzZ84s9/1p06Yxffp0Zs6cyfr163E6nXTu3Nn3jL3yfP755wwYMIDbbruNL7/8kttuu43+/fvzv//9r7J244ycaN+PHj3Kpk2bGD9+PJs2bWLRokV899139OzZ86TbjYqK8vs9yMrKokaNGpWxC2fkZMccIDU11a//5cuXn3CboXDMgTLH7cUXX8QwDPr06XPC7QbcMTfljF1xxRXmPffc47fuggsuMB988MFy6++//37zggsu8Fs3dOhQs1WrVpXWY1XIyckxAXPVqlXHrfn4449NwDx48GDVNVYJJkyYYDZv3vyU60P1mP/lL38xGzdubHo8nnLfD5XjDZiLFy/2LXs8HtPpdJqPPPKIb11RUZEZHR1tzp49+7jb6d+/v5mamuq3rmvXruZNN91U4T1XlN/ve3nWrVtnAubOnTuPWzN37lwzOjq6YpurROXt98CBA81evXqd1nZC9Zj36tXL7NChwwlrAvGYa2TnDBUXF7Nx40a6dOnit75Lly6sWbOm3M98/vnnZeq7du3Khg0bKCkpqbReK1teXh4AMTExJ6299NJLiY+Pp2PHjnz88ceV3Vql2L59OwkJCTRq1IibbrqJH3/88bi1oXjMi4uLmT9/PnfeeedJH5wbCsf7tzIzM8nOzvY7pg6Hg3bt2h337x6O/3twos8Eg7y8PAzD4Kyzzjph3eHDh0lKSqJhw4Z0796dzZs3V02DFWjlypXExsZy/vnnM2TIEHJyck5YH4rHfO/evSxbtozBgweftDbQjrnCzhnav38/brebuLg4v/VxcXFkZ2eX+5ns7Oxy60tLS9m/f3+l9VqZTNNk1KhRXH311aSkpBy3Lj4+nueee46FCxeyaNEimjZtSseOHfnkk0+qsNs/7sorr+Tll1/mvffe4/nnnyc7O5s2bdpw4MCBcutD8Zi/9dZbHDp0iEGDBh23JlSO9+8d+9s+nb/7Y5873c8EuqKiIh588EFuvvnmEz4M8oILLmDevHksXbqU1157jRo1anDVVVexffv2Kuz2j+nWrRv/+c9/+Oijj3jsscdYv349HTp0wOVyHfczoXjMX3rpJSIjI+ndu/cJ6wLxmOup53/Q7/9la5rmCf+1W159eeuDxYgRI/jqq69YvXr1CeuaNm1K06ZNfcutW7dm165d/Pvf/6Zt27aV3WaF6datm++/mzVrRuvWrWncuDEvvfQSo0aNKvczoXbM58yZQ7du3UhISDhuTagc7+M53b/7M/1MoCopKeGmm27C4/HwzDPPnLC2VatWfhfzXnXVVVx22WU89dRTPPnkk5XdaoUYMGCA779TUlJo2bIlSUlJLFu27IRf/KF0zAFefPFFbrnllpNeexOIx1wjO2eofv362O32Mik9JyenTJo/xul0llsfFhZGvXr1Kq3XyjJy5EiWLl3Kxx9/TMOGDU/7861atQqqf92Vp3bt2jRr1uy4+xFqx3znzp188MEH3HXXXaf92VA43sfuvDudv/tjnzvdzwSqkpIS+vfvT2ZmJitWrDjhqE55bDYbl19+eVD/LsTHx5OUlHTCfQilYw7w6aef8u23357R334gHHOFnTMUERFBixYtfHelHLNixQratGlT7mdat25dpv7999+nZcuWhIeHV1qvFc00TUaMGMGiRYv46KOPaNSo0RltZ/PmzcTHx1dwd1XL5XLx9ddfH3c/QuWYHzN37lxiY2O5/vrrT/uzoXC8GzVqhNPp9DumxcXFrFq16rh/93D834MTfSYQHQs627dv54MPPjijwG6aJl988UVQ/y4cOHCAXbt2nXAfQuWYHzNnzhxatGhB8+bNT/uzAXHMrboyOhQsWLDADA8PN+fMmWNu27bNTEtLM2vXrm3u2LHDNE3TfPDBB83bbrvNV//jjz+atWrVMv/617+a27ZtM+fMmWOGh4ebb775plW7cEaGDRtmRkdHmytXrjSzsrJ8r6NHj/pqfr/vM2bMMBcvXmx+9913ZkZGhvnggw+agLlw4UIrduGMjR492ly5cqX5448/mmvXrjW7d+9uRkZGhvwxN03TdLvd5tlnn20+8MADZd4LpeNdUFBgbt682dy8ebMJmNOnTzc3b97su+PokUceMaOjo81FixaZW7ZsMf/85z+b8fHxZn5+vm8bt912m99dmZ999plpt9vNRx55xPz666/NRx55xAwLCzPXrl1b5ft3Iifa95KSErNnz55mw4YNzS+++MLvb9/lcvm28ft9nzhxopmenm7+8MMP5ubNm8077rjDDAsLM//3v/9ZsYvlOtF+FxQUmKNHjzbXrFljZmZmmh9//LHZunVr809/+lPIH/Nj8vLyzFq1apmzZs0qdxvBcMwVdv6gp59+2kxKSjIjIiLMyy67zO/264EDB5rt2rXzq1+5cqV56aWXmhEREeY555xz3F+eQAaU+5o7d66v5vf7PnXqVLNx48ZmjRo1zLp165pXX321uWzZsqpv/g8aMGCAGR8fb4aHh5sJCQlm7969za1bt/reD9Vjbpqm+d5775mA+e2335Z5L5SO97Hb5n//GjhwoGma3tvPJ0yYYDqdTtPhcJht27Y1t2zZ4reNdu3a+eqPeeONN8ymTZua4eHh5gUXXBCQwe9E+56ZmXncv/2PP/7Yt43f73taWpp59tlnmxEREWaDBg3MLl26mGvWrKn6nTuBE+330aNHzS5dupgNGjQww8PDzbPPPtscOHCg+dNPP/ltIxSP+THPPvusWbNmTfPQoUPlbiMYjrlhmr9cLSkiIiISgnTNjoiIiIQ0hR0REREJaQo7IiIiEtIUdkRERCSkKeyIiIhISFPYERERkZCmsCMiIiIhTWFHREREQprCjoiEHLfbTZs2bejTp4/f+ry8PBITE/n73/9uUWciYgXNoCwiIWn79u1ccsklPPfcc9xyyy0A3H777Xz55ZesX7+eiIgIizsUkaqisCMiIevJJ59k4sSJZGRksH79evr168e6deu45JJLrG5NRKqQwo6IhCzTNOnQoQN2u50tW7YwcuRIncISqYYUdkQkpH3zzTdceOGFNGvWjE2bNhEWFmZ1SyJSxXSBsoiEtBdffJFatWqRmZnJ7t27rW5HRCygkR0RCVmff/45bdu25d1332XatGm43W4++OADDMOwujURqUIa2RGRkFRYWMjAgQMZOnQonTp14oUXXmD9+vU8++yzVrcmIlVMYUdEQtKDDz6Ix+Nh6tSpAJx99tk89thj/O1vf2PHjh3WNiciVUqnsUQk5KxatYqOHTuycuVKrr76ar/3unbtSmlpqU5niVQjCjsiIiIS0nQaS0REREKawo6IiIiENIUdERERCWkKOyIiIhLSFHZEREQkpCnsiIiISEhT2BEREZGQprAjIiIiIU1hR0REREKawo6IiIiENIUdERERCWkKOyIiIhLS/h9V2pkP6cbG4wAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "A = 20\n",
    "B = 5\n",
    "\n",
    "X = np.arange(0,19).reshape(-1, 1)\n",
    "Y = np.array(A*X+B)\n",
    "\n",
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X, Y)\n",
    "\n",
    "#系数，截距\n",
    "regr.coef_, regr.intercept_\n",
    "#散点图\n",
    "plt.scatter(X, Y )\n",
    "#拟合直线\n",
    "plt.plot(X, regr.coef_*X+regr.intercept_, '*')\n",
    "plt.plot(X[:, 0], Y)\n",
    "#标签\n",
    "plt.xlabel('X')\n",
    "plt.ylabel('Y')\n",
    "plt.title('result'.format(regr.coef_))\n",
    "\n",
    "print(X)\n",
    "print(Y)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1def647-450d-4850-8b12-1998fc4a6e85",
   "metadata": {},
   "source": [
    "# 3.噪声分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 388,
   "id": "65eb1019-b0cf-4006-b414-111694b0c7a9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ -8.25506435]\n",
      " [ 21.29548119]\n",
      " [ 47.90334395]\n",
      " [ 46.5686281 ]\n",
      " [ 72.86876737]\n",
      " [117.87369763]\n",
      " [116.2659354 ]\n",
      " [136.88995315]\n",
      " [154.47272087]\n",
      " [174.99967043]\n",
      " [186.362738  ]\n",
      " [227.32348916]\n",
      " [243.41018228]\n",
      " [270.37968064]\n",
      " [288.78771584]\n",
      " [306.33413068]\n",
      " [318.24933818]\n",
      " [349.54457043]\n",
      " [358.86913553]]\n",
      "拟合直线的斜率: [20.]\n",
      "拟合直线的截距: 4.999999999999943\n"
     ]
    },
    {
     "data": {
      "image/png": "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HHl5eURERHjteZsDvffAe++B+r4hcN97oL5v0HtvKu/dsiyKioq46KKLCAqqfiZIkx8RCQoKIjY2tsGePyIiwucHy1f03gPvvQfq+4bAfe+B+r5B770pvPeaRkLKaLKqiIiI+IyCiIiIiPhMwAaR0NBQHn30UUJDQ33dlUan9x547z1Q3zcE7nsP1PcNeu/N7b03+cmqIiIi4r8CdkREREREfE9BRERERHxGQURERER8RkHED23dupUuXboQHBxM//79ycnJOec+o0ePxmazlT+GDRvWCD0Vb1i5cmWFY1f2WLlyZY376Zg3T8ePH6dz587k5uaWL6vLdx70GWguzj7mdf3OQxM95paf+sc//mFdfvnlVps2baz77rvPKi0tPec+77//vtW9e3erbdu21p/+9KdG6KX3HTx40IqKirJeffVV6+uvv7ZuvPFGa+DAgefcr0OHDtY//vEPq7Cw0CosLLROnDjRCL31rnvuuccCyh9du3Y95z7+cMxdLlf5cSssLLTy8vKsdu3aWf/+979r3K85H/Njx45ZnTp1sg4dOlS+rC7fectqXp+Bo0ePWgMGDLCA8vde1++8ZTWvz0BVx7wu33nLav7HvK7fectqmsfcL4PIDz/8YHXq1Mm64447rIMHD1q//OUvrZdffrnGfb755hsrIiLCeuyxx6zPP//c6tOnj7Vz585G6rH3vPHGG9bSpUvL2zt37rRCQkJq3CcvL8+68MILG7prDe6KK66w3nzzzfIvmNPprHF7fznmZ3vyySetyZMn17hNcz7mVf3DXJfvvGU1v8/ANddcYy1atKjCe6/Ld96ymtdnoKpjblm1/85bln8c87N58p23rKZ7zP0yiLz++utWVFSU9f3331uWZVkHDhywrrzyyhr3eeaZZ6yf/OQn5f8XtWXLFmv8+PEN3teGtnTpUuvSSy+tcZvXXnvNat++vRUTE2OFhYVZ//d//2d9++23jdRD7ygpKbHCw8OtoqIij/fxx2N+8uRJ6/zzz6/2H6wyzfmYV/UPc12+85bV/D4DZf/HW9OPkiffectqXp+Bqo55Xb7zluV/x9zT77xlNd1j7pdzRDIyMhgwYABhYWEAxMfHk52dfc59fv7zn5ffWK9fv358+umnDd7XhnTq1CkWLFjA3XffXeN2n3/+OX379uXtt98mPT2d3NxcHnrooUbqpXdkZmZiWRa9evWiVatWjBgxgq+++qrGffzxmK9fv54BAwbQqVOnGrdrzsd8+fLlTJ8+vcKyunzny/ZrTp+BLl261Lje0+88NK/PQFXHvC7fefC/Y+7pdx6a8DH3dRJqCLNmzbLuvvvuCsvatWtXY/JLTEy0nnrqqfL2iRMnrIiIiAbrY2NITk62evbsaZ06dapW+73//vtWu3btGqhXDWPt2rVW//79rY8//tj64osvrFGjRlkjRoyocR9/POYJCQnW3/72t1rv1xyPOWf8H2JdvvOW1Xw/A1Tzf8d1/c5bVvP4DJz5vuvynbcs/zvmdf3OW1bTOeZN/u67dREcHFypvG3Lli0pLi4mKirKo33Ktm+uduzYwbJly0hLS6NFixa12rdNmzYcO3YMl8vVbMoEjx8/nvHjx5e3lyxZQpcuXXA6ndXegdLfjvnBgwc5ePBgnWbBN8djfqa6fOer2q85fwbq852H5vcZqMt3HvzrmNfnOw9N55j75amZ6Ohojh49WmFZUVERISEhHu9zru2bsi+++ILx48ezdOlSLr300nNuP27cONLS0srb+/bt48ILL2wW/xhVp02bNpSWllJQUFDtNv50zAE2bdrEqFGjPPoR8rdjXpfvfFX7NdfPQG2/8+B/nwFPvvPgP8ccavedh6Z7zP0yiCQkJFT4j52bm4vL5SI6OtrjfQ4cOEBMTEyD9rMhnDx5klGjRnHDDTcwZswYTpw4wYkTJ7AsC6fTSUlJSaV94uPjmTlzJh999BHbtm3jkUce8egcc1Mya9YsNm3aVN7et28fQUFBxMXFVbuPvxzzMm+99RZDhw6tsMyfj/mZ6vKdr2q/5vgZqOk7D/77GajLdx7845iXqeo7D83wmPv63FBDKCkpsdq3b2+tWrXKsizLuuOOO6xRo0ZZlmVZDoejyvOnR48etVq2bGnt3LnTKikpsUaOHGndc889jdpvb3j99dcrXFdf9jh06JDVsWNH6/XXX6+0z6lTp6xJkyZZ4eHhVteuXa3HHnvMKikpafzO18OqVausbt26Wbt27bLeffddq3v37takSZMsy/L/Y25ZllVcXGyFhIRYOTk5FZb78zHnrCsoqvvOW5b/fQY464qh6r7zluVfn4Ez31dN33nL8u9jblnVf+ctq/kdc78MIpZlvpytWrWyzj//fKtt27ZWVlaWZVnVHyDLsqznn3/eatGihdWuXTurY8eO1tdff92IPZb6evDBB602bdpYcXFx1rRp08oL9eiY+6ez/2Gu7jtvWfoM+Iuzj3l133nL0jFvTmyW9d/xOz+Un59Peno6AwcOpH379h7tc/DgQXJycrj66qtrnPAk/kPH3H/U5TsP+gwEIh3zpsOvg4iIiIg0bX45WVVERESaBwURERER8RkFEREREfEZBRERERHxGQURERER8RkFEREREfEZBRERERHxGQURERER8RkFEREREfGZ/w9kSWnqQ4VmaQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#制造噪声\n",
    "noise = np.random.normal(0, 10, Y.shape)\n",
    "Y_Composite = Y + noise\n",
    "print(Y_Composite)\n",
    "#斜率与截距\n",
    "noise_coef = regr.coef_\n",
    "noise_intercept = regr.intercept_\n",
    "#绘制噪声拟合结果\n",
    "#散点图\n",
    "plt.scatter(X, Y_Composite ,color = 'blue')\n",
    "#拟合线(直线)\n",
    "plt.plot(X, noise_coef*X+noise_intercept , color ='red')\n",
    "\n",
    "#散点连接线（折线）\n",
    "#plt.plot(X[:, 0], Y_Composite , color = 'green' )\n",
    "\n",
    "print(f\"拟合直线的斜率: {noise_coef[0]}\")\n",
    "print(f\"拟合直线的截距: {noise_intercept[0]}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "57301a23-64f0-45bc-b4c3-36547be7e150",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
